package exceptionlog;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class ExceptionLog {

    private static final Logger logger = LoggerFactory.getLogger(ExceptionLog.class); 
    
    //log file sync等待时间发生在redo log从log buffer写入到log file期间。
    
    /**
     * 不可以直接使用Log4j、Logback自带的api记录自己业务系统的日志
     * 应该依赖使用日志框架 SLF4J 中的 API,比较统一日志格式,便于后续日志分析
     * 有利于维护和各个类的日志处理方式统一
     * 1、添加依赖包logback使用需要和slf4j一起使用，所以总共需要添加依赖的包有slf4j-api
     * logback使用需要和slf4j一起使用，所以总共需要添加依赖的包有slf4j-api.jar，logback-core.jar，logback-classic.jar。
     * logback-access.jar这个暂时用不到所以不添加依赖了
     * GY
     * 2017年9月26日
     */
    @Test
    public void runtimeExceptionNotUseTryCatch(){
        //trace： 是追踪，就是程序推进以下，你就可以写个trace输出，所以trace应该会特别多，不过没关系，我们可以设置最低日志级别不让他输出。一般没人用
        logger.trace("trace");
        logger.info("info");
        logger.debug("debug");
        logger.warn("warn");
        logger.error("error");
        //fatal： 级别比较高了。重大错误，这种级别你可以直接停止程序了，是不应该出现的错误么！不用那么紧张，其实就是一个程度的问题。SLF4J 中的 API没有
    }
    
    /*
     * 3、
     * 日志命名规范化
     * mppserver 应用中单独监控时区转换异常，
     * 如：mppserver_monitor_timeZoneConvert.log 
     * 说明：推荐对日志进行分类，如将错误日志和业务日志分开存放，便于开发人员查看，也便于 通过日志对系统进行及时监控。
     */
    
    /*
     * 4、
     * 必须使用条件输出形式或者使用占位符的方式 1、拼接;2、{},传参数
     * 如果代码中所打印的日志,没有达到日志级别的要求,应该要考虑 打印日志 所占用的系统资源,
     * 执行了上述操作(代码)，最终日志却没有打印
     * 
     */
    
    
    /*
     * 5、
     * 避免打印重复日志
     * 尽量避免循环打印日志
     * 浪费磁盘空间
     * 避免重复打印的一个方面的正例子:<logger name="com.taobao.dubbo.config" additivity="false"> 
     * log4j.xml 中设置 additivity=false
     * 
     * 它是 子Logger是否继承 父Logger 的 输出源（appender） 的标志位。
     * 具体说，默认情况下子Logger会继承父Logger的appender，也就是说子Logger会在父Logger的appender里输出。
     * 若是additivity设为false，则子Logger只会在自己的appender里输出，而不会在父Logger的appender里输出。
     */
    
    /*
     * 6、
     * 异常信息应该包括两类信息:
     * 案发现场信息和异常堆栈信息
     * logger.error(各类参数或者对象 toString + "_" + e.getMessage(), e);
     */
    @Test
    public void exceptionInfoLog(){
        File file = new File("I:\\javaeeWorkspace\\exceptionLog\\test.txt");
        try(FileOutputStream fos = new FileOutputStream(file)){
            
        } catch (FileNotFoundException e) {
            //e.printStackTrace();
            logger.error("文件找不到:"+e.getMessage(), e);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //FileOutputStream fos = null;
        /*try {
            fos = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            logger.error("文件找不到"+e.getMessage(), e);
        } finally {
            if(fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }*/
    }
    
    /*
     * 7、
     * 生产环境禁止输出 debug 日志；有选择地输出 info 日志；】
     * 如果使 用 warn 来记录刚上线时的业务行为信息，一定要注意日志输出量的问题，
     * 避免把服务器磁盘 撑爆，并记得及时删除这些观察日志。 
     */
    
    /*
     * 8、
     * 可以使用 warn 日志级别来记录用户输入参数错误的情况，避免用户投诉时，无所适从
     * error 级别只记录系统逻辑出错、异常等重要的错误信息
     */
}

